import axios from 'axios'
import type { AxiosInstance, InternalAxiosRequestConfig, AxiosResponse } from 'axios'
import { message } from './message'

// 创建 axios 实例
const instance: AxiosInstance = axios.create({
  baseURL: '/api',
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json'
  },
  // 允许跨域请求时携带凭证
  withCredentials: true
})

// 请求拦截器
instance.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    console.log('Request:', {
      url: config.url,
      method: config.method,
      data: config.data,
      headers: config.headers
    })
    
    // 登录和注册接口不需要携带 token
    const noTokenUrls = ['/users/login', '/users/register']
    if (!noTokenUrls.includes(config.url || '')) {
      const token = localStorage.getItem('token')
      if (token) {
        config.headers = config.headers || {}
        config.headers.Authorization = `Bearer ${token}`
      }
    }
    
    return config
  },
  (error) => {
    console.error('[Request Error]', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
instance.interceptors.response.use(
  (response: AxiosResponse) => {
    console.log('Response data structure:', {
      url: response.config.url,
      status: response.status,
      rawData: response.data,
      code: response.data?.code,
      message: response.data?.message,
      data: response.data?.data
    })

    // 确保 response.data 存在且是预期的格式
    if (!response.data || typeof response.data !== 'object') {
      console.error('Invalid response format:', response.data)
      return Promise.reject(new Error('服务器响应格式错误'))
    }

    const { code, message: msg, data } = response.data

    // 打印详细的条件判断信息
    console.log('Response validation:', {
      code,
      isCode200: code === 200,
      hasData: !!data
    })

    // 修改这里：根据后端的实际响应格式处理
    if (response.status === 200) {  // 使用 HTTP 状态码
      if (code === 200) {  // 业务状态码
        return data
      } else if (code === 500) {  // 业务错误
        return Promise.reject(new Error(msg || '请求失败'))
      }
    }

    // 其他情况
    console.error('Unexpected response:', {
      httpStatus: response.status,
      code,
      message: msg,
      data
    })

    return Promise.reject(new Error(msg || '未知错误'))
  },
  (error) => {
    // 详细记录错误信息
    console.error('Response Error Details:', {
      config: error.config,
      response: {
        status: error.response?.status,
        data: error.response?.data,
        headers: error.response?.headers
      },
      message: error.message,
      stack: error.stack
    })

    // HTTP 错误处理
    if (error.response) {
      const msg = error.response.data?.message || '服务器错误'
      switch (error.response.status) {
        case 401:
          // 清除本地存储的认证信息
          localStorage.removeItem('token')
          localStorage.removeItem('user')
          // 可以在这里添加重定向到登录页的逻辑
          return Promise.reject(new Error('请重新登录'))
        case 403:
          return Promise.reject(new Error('没有权限'))
        case 404:
          return Promise.reject(new Error('资源不存在'))
        default:
          return Promise.reject(new Error(msg))
      }
    }
    
    // 网络错误等其他错误
    return Promise.reject(new Error('网络错误，请稍后重试'))
  }
)

export default instance 